home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / Tools / frdm205d / LIBERTY / DOKU / LIBERTY.TXT < prev   
Encoding:
Text File  |  1998-09-20  |  56.0 KB  |  1,324 lines

  1.                                Liberty
  2.  
  3.                     Dokumentation zur Version 1.31
  4.                               20.09.1998
  5.  
  6.                                  von
  7.  
  8.                            Christian Krüger
  9.                            Im Erpelgrund 16
  10.                              13503 Berlin
  11.  
  12.                        Internet: chris@pace.de
  13.  
  14.  
  15.  
  16. Inhaltsverzeichnis
  17. ==================
  18.  
  19.  1  Rechtliches / Copyright
  20.     1.1  Haftungsausschluß
  21.     1.2  Warenzeichen
  22.     1.3  Spenden
  23.  
  24.  2  Installation
  25.     2.1  Bootreihenfolge
  26.  
  27.  3  Was ist Liberty?
  28.  
  29.  4  Was bietet Liberty?
  30.     4.1  CJar-Erweiterung
  31.     4.2  Soundfunktionen
  32.     4.3  Vektorgrafikfunktionen
  33.          4.3.1  Der Konvertierer GM2CKVDI
  34.  
  35.  5  An die programmierenden Zunft
  36.     5.1  Allgemeines
  37.          5.1.1  Parameterübergabe
  38.     5.2  Der Liberty-Cookie & XBIOS-Erweiterung
  39.     5.3  Die Liberty-Struktur
  40.     5.4  Die Utility-Funktionen
  41.          5.4.1  Init_Liberty();
  42.          5.4.2  lock_Sema();
  43.          5.4.3  release_Sema();
  44.          5.4.4  memcpy();
  45.          5.4.5  memset();
  46.     5.5  Die 'GEMDOS-Erweiterungen'
  47.          5.5.1  CK_init_meminfo()
  48.          5.5.2  CK_malloc()
  49.          5.5.3  CK_realloc()
  50.          5.5.4  CK_free()
  51.          5.5.5  CK_load_buffer()
  52.     5.6  Die 'VDI-Erweiterungen'
  53.     5.7  Die 'AES-Unterstützung'
  54.     5.8  Die Sound-Funktionen
  55.     5.9  Programmbeispiel
  56.  
  57.  6  Ausblick
  58.  
  59.  7  Changes
  60.  
  61.  8  Kontaktadresse
  62.  
  63.  
  64.  
  65. 1  Rechtliches / Copyright
  66. **************************
  67.  
  68. Das Copyright  an Liberty und dieser Dokumentation liegt bei Christian
  69. Krüger, Berlin. Die Weitergabe des Programms  ist  Grundsätzlich  frei
  70. (Stichwort FREEWARE), dennoch sind folgende Punkte zu beachten:
  71.  
  72.    ∙ Das  Programm  darf  nur  mit  allen  zugehörigen  Dateien und in
  73.      *unveränderter* Form weitergegeben werden.  Entweder  unkomprimiert
  74.      oder als 'Zip'-Archiv. Folgende Dateien müssen folglich im Archiv
  75.      enthalten sein (-> = Ordner):
  76.  
  77.  
  78.  
  79.            LIBERTY -> AUTO        -> LIBERTY.PRG
  80.                       DEVELOP     -> IBMR.H
  81.                                      VDICODES.H
  82.                       DOKU        -> HTML         -> LIBERTY.HTM
  83.                                                      LIBERTY.GIF
  84.                                                      MYSELF.GIF
  85.                                                      UDO_LF.GIF
  86.                                                      UDO_RG.GIF
  87.                                                      UDO_UP.GIF
  88.                                      LIBERTY.TXT
  89.                                      LIBERTY.H
  90.                                      LIBERTY.HYP
  91.                       MCSNDPAT    -> MACSND.DFY
  92.                                      PATCHY.TTP
  93.                       SIZEJAR.TTP
  94.                       GM2CKVDI.TTP
  95.  
  96.  
  97.    ∙ Das Programm darf generell nur  kostenlos  weitergegeben  werden.
  98.      Der  Upload  in gebührenfreie Mailboxen und auf nichtkommerzielle
  99.      FTP-Server ist erlaubt und erwünscht.
  100.  
  101.    ∙ Dem Archiv dürfen  keine  weiteren  Dateien  hinzugefügt  werden,
  102.      insbesondere  keine  Mailboxwerbung  und  keine  Werbung  für PD-
  103.      Serien.  Die  Umbenennung  oder  das  Umpacken  des  Archivs  ist
  104.      unerwünscht.
  105.  
  106.    ∙ Das  Programm darf anderen Programme beigelegt werden - unter der
  107.      Voraussetzung,   daß   ich   *vor   der   Veröffentlichung* darüber
  108.      informiert  werde  und  ein eindeutiger Hinweis auf die Versions-
  109.      nummer   der   beigefügten    Liberty-Version    erfolgt    (z.B.
  110.      hervorgehoben im 'README').
  111.      Auch hier gilt obiges 'Vollständigkeitsprinzip'!
  112.  
  113.    ∙ Für  die  Weitergabe auf Disketten im Rahmen einer Public-Domain-
  114.      Serie dürfen keine Gebühren verlangt werden, die einen Betrag von
  115.      10 DM (exklusive Versandkosten) überschreiten.
  116.  
  117.    ∙ Die  Weitergabe  via  CD-ROM  darf  nur  dann  ohne  schriftliche
  118.      Genehmigung erfolgen,  wenn  der  Preis  der  CD  pro  bespieltem
  119.      MegaByte 0.1 DM nicht übersteigt!
  120.  
  121.  
  122. 1.1  Haftungsausschluß
  123. ======================
  124.  
  125. Trotz sorgfältiger  Entwicklung  und  umfangreichen  Tests  kann keine
  126. Gewährleistung für die Richtigkeit des  Inhalts  dieser  Dokumentation
  127. und die einwandfreie Funktion von "Liberty" übernommen werden.
  128.  
  129. Der Autor kann keine Haftung für irgendwelche direkten oder indirekten
  130. Schäden - einschließlich aber nicht  beschränkt  auf  materielle  oder
  131. finanzielle  -  übernehmen, die durch die Benutzung von "Liberty" oder
  132. dessen Untauglichkeit für einen bestimmten Zweck entstehen.
  133.  
  134.  
  135. 1.2  Warenzeichen
  136. =================
  137.  
  138. Innerhalb dieser Dokumentation wird auf Warenzeichen  Bezug  genommen,
  139. die  nicht  explizit als solche ausgewiesen sind. Aus dem Fehlen einer
  140. Kennzeichnung kann nicht geschlossen werden, daß ein Name frei von den
  141. Rechten Dritter ist.
  142.  
  143.  
  144. 1.3  Spenden
  145. ============
  146.  
  147. Wie schon   erwähnt  ist  Liberty  Freeware.  Ich  habe  aber  selbst-
  148. verständlich nichts gegen TOS-Programmentwicklungsstützungskäufe  ;-).
  149. Wer mit also eine motivationssteigernde Spende zukommen lassen möchte,
  150. kann das über die Kontaktadresse tun.
  151. Wer keine Lust hat etwas zu  spenden  und  trotzdem  meine  Motivation
  152. steigern  möchte,  der sollte sich 'Freedom2' kaufen. Dann bekommt man
  153. wenigstens etwas für's Geld ;-) ...
  154.  
  155.  
  156.  
  157. 2  Installation
  158. ***************
  159.  
  160. *(Bitte dieses Kapitel komplett _vor_ der Installation durchlesen!)*
  161.  
  162. Kopieren Sie einfach 'LIBERTY.PRG'  in  den  AUTO-Ordner  ihres  Boot-
  163. Laufwerkes.
  164.  
  165. Nach dem  Kopieren  von  'LIBERTY.PRG'  und  dem folgenden Systemstart
  166. installiert sich dann die Library automatisch.
  167.  
  168.  
  169. 2.1  Bootreihenfolge
  170. ====================
  171.  
  172. 'LIBERTY.PRG' sollte  physikalisch  möglichst  früh   im   AUTO-Ordner
  173. stehen,  auf  jeden  Fall vor (wenn Sie es denn einsetzen) MiNT! Viele
  174. Bootselektoren   (z.B.   XBOOT)   erlauben   es,    konfortabel    die
  175. Bootreihenfolge  der  AUTO-Ordner  Programme zu verändern. Sollten Sie
  176. nicht in Besitz eines solchen Programms sein hilft folgendes:
  177. Betrachten Sie sich  ihren  AUTO-Ordner  im  Desktop  in  unsortierter
  178. Ausgabeart. Hier sollte 'LIBERTY.PRG' möglichst weit vorne stehen. Ein
  179. Ändern  der  Bootreihenfolge  erreichen  Sie  durch  Verschieben   des
  180. kompletten   AUTO-Ordners   in   ein   anderes   Verzeichnis  und  dem
  181. Zurückverschieben   aller   AUTO-Ordner-Programme    in    gewünschter
  182. Reihenfolge  in  den  AUTO-Ordner. (Wer absolut nicht versteht was ich
  183. meine,  kann  mich  unter  später  genannter  Adresse   kontaktieren.)
  184. MagiCMac  Benutzer  müssen  den Umweg über Umbenennen der Dateien oder
  185. Bootreihenfolgedatei (wie in der MagiCMac  Dokumentation  beschrieben)
  186. gehen  um  Liberty  möglichst  früh  zu  initalisieren (MiNT wird wohl
  187. keiner auf Macs benutzen ;-) ).
  188.  
  189.  
  190.  
  191. 3  Was ist Liberty?
  192. *******************
  193.  
  194. Liberty ist eine residente Systemerweiterung. Das bedeutet,  daß  eine
  195. Vielzahl  von  Funktionen  die  in  Liberty  vorhanden  sind,  anderen
  196. Programmen angeboten  werden.  Das  bloße  Vorhandensein  von  Liberty
  197. ändert  nicht viel an Ihrem System, sondern die Funktionen der Library
  198. (oder auch Systemerweiterung, folgend Lib genannt) müssen von  anderen
  199. Programmen  genutzt  werden.  Freedom2  ist z.B. ein solches Programm.
  200. Freedom2 benutzt viele der Liberty-Funktionen, so daß  es  ohne  diese
  201. Lib nicht lauffähig ist.
  202.  
  203. Nun gibt  es  (oft  zurecht) viele Gegner solcher Systemerweiterungen.
  204. Die Argumente gegen den  Einsatz  einer  residenten  Erweiterung  sind
  205. meistens folgende:
  206.  
  207.    ∙ residente  Systemerweiterungen schlucken permanent Speicher, auch
  208.      wenn sie nicht benötigt werden
  209.  
  210.    ∙ residente Systemerweiterungen  werden  oftmals  nur  von  wenigen
  211.      Programmen  unterstützt  und  viele  Funktionen  der  Erweiterung
  212.      werden nicht benötigt, was dann  ebenfalls  Speicherverschwendung
  213.      bedeutet
  214.  
  215.    ∙ residente  Systemerweiterungen  sind groß, klobig und unflexibel;
  216.      bei  Zugriff  von  mehreren  Programmen  auf  eine  Funktion  der
  217.      Erweiterungen   gibt  es  oft  Probleme  oder  der  Rechner  wird
  218.      'gebremst' (Experten mögen mir verzeihen, daß ich hier nicht  von
  219.      Semaphoren spreche :-) )
  220.  
  221. Die Vorteile solcher Erweiterungen:
  222.  
  223.    ∙ das  'Rad'  muß  nicht  tausendmal neu erfunden werden; Programme
  224.      können die angebotenen Funktionen einfach benutzen ohne zu wissen
  225.      was  sie  (die  Funktionen  ;-))  genau machen (daraus folgt eine
  226.      wesentlich kürzere Entwicklungszeit und (hoffentlich)  mehr  Spaß
  227.      am  Programmieren,  da  man  sich  auf  die  programmspezifischen
  228.      Probleme konzentrieren kann)
  229.  
  230.    ∙ benutzen viele Programme  die  Systemerweiterung  gibt  es  einen
  231.      Speicherspareffekt: die von vielen Programmen benötigten Routinen
  232.      der Systemerweiterung sind nur einmal im Speicher  und  nicht  in
  233.      jedem der Programme extra vorhanden.
  234.  
  235. Liberty hat  natürlich  diese  Vorteile  und entkräftet zusätzlich mit
  236. seiner Art des Aufbaus die Nachteile:
  237.  
  238.    ∙ Liberty verbraucht weniger als  30kB  Speicher!  (ist  also  kein
  239.      'grober  Klotz'  wie  andere  Libs  die gleich 300kB oder mehr an
  240.      Speicher verschlingen)
  241.  
  242.    ∙ Liberty konzentriert  sich  auf  die  wesentlichsten  Mankos  des
  243.      Betriebsystems  und  beseitigt  sie;  es ist keine GEM-Interface-
  244.      Library! (wäre wohl  auch  sinnlos  zu  versuchen  alle  GEM-Lib-
  245.      Programmier- Süppchen zu einem Standard zu vereinigen ;-) )
  246.  
  247.    ∙ fast  alle  Funktionen  der  Lib werden von Freedom2 benutzt (wer
  248.      kommt schon ohne aus? ;-) ); von Speicherverschwendung  kann  bei
  249.      Einsatz  von  Freedom2 folglich nicht gesprochen werden (bei 30kB
  250.      ist dieses ohnehin schon  ziemlich  unglaubwürdig);  bereits  bei
  251.      Einsatz  eines  zweiten  Programms welches Liberty benutzt, tritt
  252.      der gewünschte Speicherspareffekt ein
  253.  
  254.    ∙ Liberty besteht zu 90%  aus  hochoptimierten  Assembler-Routinen;
  255.      nur  so  konnte  die  Kürze  und  Geschwindigkeit der Erweiterung
  256.      erreicht werden
  257.  
  258.    ∙ alle Funktionen von Liberty sind reentrant und 90% der Funktionen
  259.      sind   'Multi-Threading'-fähig  (d.h.  mehrere  Programme  können
  260.      gleichzeitig eine Funktion von Liberty benutzen ohne  sich  dabei
  261.      gegenseitig zu stören oder zu blockieren)
  262.  
  263. Überzeugt?
  264.  
  265.  
  266.  
  267. 4  Was bietet Liberty?
  268. **********************
  269.  
  270. Liberty setzt   sich   aus   Funktionen  mit  den  unterschiedlichsten
  271. Aufgabengebieten   zusammen.   Obwohl   daher   das   Funktionsangebot
  272. vielleicht  etwas  zusammengewürfelt  scheint,  ist  dem nicht so. Wie
  273. schon  erwähnt  versucht  Liberty   die   nervensten   Schwächen   des
  274. Betriebsystems    auszugleichen:    Funktionen,   die   immer   wieder
  275. programmiert oder eingebunden werden müssen und  die  viele  Programme
  276. benötigen.  Das diese Schwächen nicht konzentriert an einer Stelle des
  277. Betriebssystems auftreten ist logisch. So besteht die Lib  intern  aus
  278. folgenden Teilen:
  279.  
  280.      XBIOS-Erweiterung bzw. Nutzung:
  281.  
  282.         ∙ CJar-kompatibele    XBIOS    Erweiterung,    die    auf
  283.           komfortabele Weise das Erzeugen, Abfragen  und  Löschen
  284.           von 'Cookies' ermöglicht
  285.  
  286.         ∙ Soundfunktionen    welche    eine    rechnerunabhängige
  287.           Tonausgabe garantieren
  288.  
  289.      Erweiterungen mit GEMDOS-Charakteristik:
  290.  
  291.         ∙ eine sehr effiziente und  schnelle  Speicherverwaltung,
  292.           die   privaten,  globalen,  normalen  und  alternativen
  293.           Speicher  (wenn  nötig)  unterscheidet   und   kleinere
  294.           Speicherblöcke  in  größeren  verwaltet  sowie  für ein
  295.           dauerhaftes, sicheres 'malloc' für ACCs unter SingleTOS
  296.           sorgt
  297.  
  298.         ∙ eine  Routine  zum  Laden  einer  Datei in einen Puffer
  299.           (sollte die Datei mit ATOMIK 3.5 gepackt sein, so  wird
  300.           diese automatisch ausgepackt!)
  301.  
  302.      Erweiterungen mit VDI-Charakteristik:
  303.  
  304.         ∙ eine Vielzahl von sehr schnellen Rastergrafikfunktionen
  305.           (Laden von XIMG/GIF, Skalieren etc.)
  306.  
  307.         ∙ Vektorgrafikfunktionen     (Translation,      Rotation,
  308.           Skalierung,  ...) - damit sind endlich auf einfache und
  309.           komfortabele Weise Vektoricons realisierbar
  310.  
  311.      AES-Unterstützung:
  312.  
  313.         ∙ Funktionen zum einfachen Einhängen  von  Funktionen  in
  314.           einzelne AES- Calls (mit Applikationszustandslisten!)
  315.  
  316.         ∙ LIBERTY  ist  in  der  Lage  (auch  wenn  kein Programm
  317.           Liberty    benutzt)    defekte     AES-Calls     (nicht
  318.           initalisiertes  Global-Field) zu reparieren! Damit wird
  319.           u.a. erreicht, daß z.B. der Dateiselektor Freedom  auch
  320.           von ('Schweine'-)Programmen aufgerufen werden kann, bei
  321.           denen  sonst  die  normale  Dateiauswahlbox  erscheinen
  322.           würde!
  323.  
  324.  
  325. 4.1  CJar-Erweiterung
  326. =====================
  327.  
  328. Liberty legt  beim Start im AUTO-Ordner automatisch einen 'Cookie-Jar'
  329. an. Programme die dieses sonst  übernommen  haben  ('CJARxxx.*'  etc.)
  330. sind  damit  überflüssig! Ebenfalls, das für den MiNT Aufsatz 'Geneva'
  331. benötigte 'JARxxx.PRG' ist unnötig. In Liberty  sind  die  Fähigkeiten
  332. dieses  Programms  enthalten! (JARxxx wurde getestet, für gut befunden
  333. und die Funktionalität (erweitert) aufgenommen.)
  334.  
  335. Die Größe  des  'Cookie-Jar'  kann  mit   dem   beigefügten   Programm
  336. 'SIZEJAR.TTP'  verändert  werden.  In  der  Grundeinstellung wird beim
  337. Start  von  Liberty  für  32  zusätzliche  'Kekse'  (zu  den   aktuell
  338. vorhandenen  Systemcookies)  Platz  geschaffen.  Diesen  Wert kann man
  339. wiefolgt ändern:
  340.  
  341.   1. Man kopiert 'SIZEJAR.TTP' in das Verzeichnis in dem 'LIBERTY.PRG'
  342.      steht (also normalerweise in den AUTO-Ordner).
  343.  
  344.   2. Man  startet  das  Programm  durch  Doppelklick und gibt dann die
  345.      gewünschte Anzahl an Keksen als Zahl in den erscheinenden  Dialog
  346.      ein.
  347.  
  348.   3. Nach  Beendigung  des  Programms muß man 'SIZEJAR.TTP' wieder aus
  349.      dem AUTO-Ordner entfernen.
  350.  
  351.   4. Beim  Neustart  des  Systems  berücksichtigt  dann  Liberty   die
  352.      angegebene Anzahl. Fertig!
  353.  
  354. In der  Regel  sollte  dieses  Vorgehen  jedoch  unnötig  sein,  da 32
  355. (zusätzliche)    Kekse    ausreichen    und    auch    keine     große
  356. Speicherverschwendung darstellen.
  357.  
  358.  
  359. 4.2  Soundfunktionen
  360. ====================
  361.  
  362. Liberty bietet  eine  komfortable  und  *einheitliche* Schnittstelle zur
  363. Soundausgabe. Mit Hilfe dieser Erweiterung können (bald) alle Benutzer
  364. von  Atari-Kompatiblen  in  den  Genuß  eines  klangvollen Erlebnisses
  365. kommen. Die Zeiten bei denen Programme die Soundausgabe auf  bestimmte
  366. Systeme   einschränken,   oder  diese  nur  mit  /käuflichen/ Programmen
  367. garantieren, sollten damit für immer vorbei sein.
  368.  
  369. Realisiert wurde die Soundausgabe  schon  für  Rechner  mit  DMA-Sound
  370. ((Mega)STE/TT),  FalconO3O  sowie  für  Apple-Rechner  mit 'MacSound'.
  371. Rechner mit PSG-(Emulation) folgen demnächst.
  372. Bisher hatte ich noch keinen Kontakt zu Medusen oder dem Hades,  halte
  373. hier  aber  eine  Anpassung für die exisiterende Soundkarte ebenso wie
  374. für PC's mit XBIOS-Treiber möglich (...legt  STARTRACK  ein  McSn-Keks
  375. an?  -  Dann  funktioniert  auch  mit  dieser  Karte  schon die Sound-
  376. Ausgabe...).
  377.  
  378. Wichtig ist nur, daß sich  ein  Anwenderprogrammierer  keine  Gedanken
  379. mehr   um   evt.   Soundfähigkeiten   des  Rechners  machen  muß.  Das
  380. Vorhandensein   von   Liberty   garantiert    ein    Ansprechen    der
  381. Soundfunktionen, auch wenn diese ohne Treiber funktionslos bleiben.
  382.  
  383. _*Zum Patchprogramm für MacSound (nur für Apple-Rechner):*_
  384. MacSound  (ein Autoordnerprogramm welches MagiCMac beiliegt und XBIOS-
  385. Soundfunktionen zur Verfügung stellt) ist leider nicht so mächtig  wie
  386. es anderen Programmen gegenüber vorgibt. Um korrektes Funktionieren zu
  387. gewährleisten, ist es daher nötig MacSound zu patchen. Eine Patchdatei
  388. mit   dem   entsprechenden   Patchprogramm  befindet  sich  im  Ornder
  389. 'MCSNDPAT'.
  390.  
  391. Um MacSound zu patchen, muß man folgendermaßen vorgehen:
  392.  
  393.    ∙ Zunächst  'MACSND.PRG'  (müßte  im  Auto-Ordner  liegen)  in  das
  394.      'MCSNDPAT'-Verzeichnis verschieben.
  395.  
  396.    ∙ Nun  die  Datei  'MACSND.DFY'  auf  das  Programm 'PATCHY.TTP' im
  397.      gleichen Verzeichnis ziehen und fallenlassen (Drag&Drop).
  398.  
  399.    ∙ Anschließend das Programm  'MACSND.PRG'  aus  diesem  Verzeichnis
  400.      (welches   nun   angepasst   ist)   wieder   in  den  Auto-Ordner
  401.      verfrachten. MagiCMac neustarten, fertig!
  402.  
  403. Falls irgendwelche Fehler auftreten  sollten,  handelt  es  sich  wohl
  404. nicht  um  die  Version  1.0  von  MacSound  (nur  diese kann gepatcht
  405. werden)! Sollte man eine ältere Version haben,  unbedingt  die  neuere
  406. besorgen.  Ob eine neuere Version als die 1.0 existiert (wenn ja bitte
  407. melden!), kann ich nicht sagen, mir ist jedenfalls keine bekannt.  Der
  408. Patch setzt die Versionsnummer übrigens auf 1.01 herauf!
  409. /Bei  Fragen  oder  Hinweisen  zu diesem Thema bitte die Kontaktadresse
  410. benutzen!/
  411.  
  412. Nach dem Patchen  wurde  im  Verzeichnis  'MCSNDPAT'  das  Verzeichnis
  413. 'PATCHED' angelegt, welches die Ursprungsversion von MacSound enthält.
  414. Eine Sicherungskopie der Originals wird also automatisch erzeugt.
  415.  
  416. /An dieser Stelle Dank an  Christian  Wempe  &  Holger  Weets  für  ihr
  417. Patchprogramm  'DIFFY'  bzw.  'PATCHY'.  Ich  hoffe es ist Ok, daß ich
  418. 'PATCHY'  einfach  so  (einzeln  -  um  Verwirrung  zu   vermeiden...)
  419. beigefügt  habe  (in  eurer Doku steht zu diesem Thema leider nichts),
  420. schließlich ist Liberty ja auch  Freeware.  Das  komplette  Archiv  zu
  421. 'Diffy 2' sollte man in jeder guten 'Maus / ftp-site' finden./
  422.  
  423. Ein kleiner Soundtest der Liberty-Funktionen gefällig?
  424. Den Info-Dialog von Freedom2 aufrufen (Klick mit der rechten Maustaste
  425. auf das Freedom2-Logo bei *installiertem* Konfig.CPX)  und  anschließend
  426. das große Freedom2-Logo im Info-Dialog anklicken...
  427. Wenn  sie  einen  (Mega)STE/TT/FalconO3O  oder MagiCMac mit gepatchtem
  428. MacSound benutzen, dann müßten sie was 'Nettes' gehört haben...
  429.  
  430.  
  431. 4.3  Vektorgrafikfunktionen
  432. ===========================
  433.  
  434. Vektorzeichensätze und Bezierkurven sollten  heutzutage  eine  Selbst-
  435. verständlichkeit   sein.   So   werden  diese  Befehle  auch  von  den
  436. Vektorgrafikfunktionen in Liberty  ordnungsgemäß  verarbeitet.  Leider
  437. ist  das  Original-VDI (der Betriebssystemteil der für die Ausgabe von
  438. Grafiken verantwortlich ist)  nicht  in  der  Lage  diese  Befehle  zu
  439. verarbeiten und ignoriert sie völlig.
  440. Das  bedeutet,  daß  wenn  ein  Programm die Vektorgrafikdarstellungs-
  441. funktionen  von  Liberty  benutzt  und   die   darzustellende   Grafik
  442. Bezierkurven und/oder Vektorzeichensätze enthält, das Ergebnis auf dem
  443. Bildschirm nicht der Originalgrafik  entspricht.  Dieses  trifft  aber
  444. selbstverständlich nur für VDIs zu, die diese Befehle nicht verstehen!
  445. Wie  alle  Funktionen von Liberty sind auch die Vektorgrafikfunktionen
  446. auf Geschwingidkeit getrimmt. Bei der Vektorgrafikausgabe  wurde  z.B.
  447. ein  großer  Geschwindigkeitsvorteil dadurch erreicht, daß die Ausgabe
  448. _direkt_ an das VDI geleitet wird und die Befehle nicht erst durch einen
  449. TRAP  geschickt werden! Das dabei verwendete Verfahren ist keinenfalls
  450. 'schweinisch' sondern bekannt! (Für die Experten: Man läd das Register
  451. D0  mit -1 und macht einen TRAP #2 Aufruf. Als Ergebnis erhält man die
  452. Einsprungsadresse des VDI-Dispatchers.)
  453. VDI-Erweiterungen,   die   das    VDI    hinsichtlich    z.B.    einer
  454. Bezierkurvenausgabe  erweitern,  müssen  dieses Verfahren unterstützen
  455. (Profibuch, 10. Auflage, Seite 298 unten)!
  456.  
  457. 'NVDI' (da sauber) hat damit keine  Probleme  und  in  Verbindung  mit
  458. diesem  VDI  klappt  die  Ausgabe  obiger Befehle wunderbar (auch wenn
  459. 'NVDI' nur  als  GDOS  eingesetzt  wird)!  Leider  kann  man  das  vom
  460. 'SpeedoGDOS'   nicht  behaupten.  Diese  VDI-Erweiterung  versäumt  es
  461. offensichtlich obiges Verfahren zu unterstützen und somit  ist  dieses
  462. Ausgabesystem   für   Liberty   praktisch   nicht   vorhanden   (keine
  463. Bezierkurven und keine Vektorzeichensätze!!!).
  464.  
  465. Ich weiß,  daß  diese  Tatsache  sicherlich  einige   Leute   ziemlich
  466. verärgert und möchte deshalb hier Forderungen nach 'konformer' Ausgabe
  467. über den TRAP vorbeugen:
  468.  
  469.    ∙ die oben beschriebene Vorgehensweise ist konform, da sie  bekannt
  470.      ist  und  es  offensichtlich  auch ein Ausgabesystem gibt (NVDI),
  471.      welches  damit  keine  Probleme   hat;   Liberty   ist   folglich
  472.      unschuldig,  das Problem liegt beim unvollständigem Ausgabesystem
  473.      (SpeedoGDOS)
  474.  
  475.    ∙ ein Abändern der Liberty-Vektorgrafikausgabe brächte  unzumutbare
  476.      Geschwindigkeitseinbußen     für     Benutzer    mit    konformen
  477.      Ausgabesystemen
  478.  
  479.    ∙ ich  habe   wenig   Lust   die   Fehler   anderer   Programmierer
  480.      auszubügeln...
  481.  
  482. Meine Empfehlung an SpeedoGDOS-Fanatiker die programmieren können:
  483. Programmiert  ein  Utility  welches  sich in den TRAP #2 hängt, die -1
  484. abfängt und die Adresse des SpeedoGDOS-Dispatchers zurückliefert. Dann
  485. klappt's auch mit Liberty... ;-)
  486.  
  487.  
  488. 4.3.1  Der Konvertierer GM2CKVDI
  489. --------------------------------
  490.  
  491. Um GEM-Metafiles  in  das  Liberty-Vektorformat  umzuwandeln  ist  ein
  492. Konvertierer beigefügt (GM2CKVDI.TTP). Das  Liberty-Vektorgrafikformat
  493. kann  mehrere  einzelne  Grafiken enthalten, welche es interessant für
  494. Vektoricons machen.
  495.  
  496. Da GEM-Metafiles oft sehr 'großzügig' und  unpräzise  erzeugt  werden,
  497. ist  es nicht ausgeschlossen, daß der Konvertierer bei einigen Dateien
  498. ziemlich komische Ergebnisse erzeugt. Dieses ist abhängig vom Programm
  499. mit  dem die Dateien erzeugt wurden. Ausgerichtet ist der Konvertierer
  500. auf Dateien die mit 'Kandinsky (2.01)' kreiert wurden. Hiermit  werden
  501. korrekte Ergebnisse erzielt.
  502.  
  503. _Der Aufruf:_
  504. GM2CKVDI -[cpnswm16h?] metafilename
  505.  
  506. Die übergebene  Datei  _muß_ mit  '.GEM'  enden.  Die  Zieldatei wird im
  507. Verzeichnis der Quelldatei erzeugt  und  erhält  je  nach  angegebenem
  508. Zieltyp die Dateiendung '.CVD' oder '.C'.
  509.  
  510. _Die Optionen:_
  511. Für den Übersetzungsvorgang existieren einige Optionen:
  512.  
  513.  -h,-help,-?  zeigt eine kurze Hilfe mit Erläuterung der Optionen an
  514.  
  515.  -n           setzt im Header der Zieldatei den Namen der Grafik.
  516.               Dieser   Name   kann  auch  über  die  Grafik  darselbst
  517.               definiert sein, indem die Grafik mit dem speziellen Text
  518.               '((CN))/NAME/' versehen wird. Dieser Textbefehl wird _nicht_
  519.               übersetzt   und   dient   lediglich   zum   Setzen   des
  520.               Vektorgrafiknamens im Zieldateikopf.
  521.  
  522.  -s #         setzt   den  Größenmaßstab.  Dieser  legt  die  maximale
  523.               Ausdehnung der zu erzeugenden  Datei  fest.  Mit  diesem
  524.               Wert   wird   natürlich   auch   die  Quantisierung  der
  525.               Grafikkoordinaten  in  der   Zieldatei   bestimmt.   Der
  526.               Defaultwert ist 255. Der übergebene Wert darf zwischen 1
  527.               und 32000 liegen.
  528.  
  529.  -c           die Zieldatei wird nicht als Binärfile  sondern  als  C-
  530.               Quellcode  abgelegt.  Besonders dann praktisch, wenn man
  531.               die Vektordaten in ein Programm mit einbinden möchte. Um
  532.               die  Vektordaten  einbinden  zu können, benötigt man die
  533.               '.h'-Dateien im Ordner 'DEVELOP'.  Die  Dateiendung  der
  534.               Zieldatei ist in diesem Modus '.C'.
  535.  
  536.  -m           die  angegebene Quelldatei enthält mehrer Vektorgrafiken
  537.               die    umgewandelt    werden    sollen     (z.B.     bei
  538.               Vektoricondateien).   Der   Konvertierer   erkennt   die
  539.               einzelnen Vektorgrafiken in einer solchen  Datei  daran,
  540.               daß  die  diversen  Vektorgrafikobjekte  als 'Top-Level-
  541.               'Gruppe definiert worden sind  (Kandinsky:  Gruppieren).
  542.               Als  'Top-Level'  bezeichne ich alle Gruppen die direkt,
  543.               ohne  weitere  Gruppenauflösung  in   der   Vektorgrafik
  544.               erreichbar   sind.   Diese   'Top-Level-Gruppen'  dürfen
  545.               folglich problemlos in ihrer (internen) Struktur weitere
  546.               Objektgruppen  enthalten.  Top-Level-Gruppen werden dann
  547.               jeweils   in    der    Zieldatei    als    eigenständige
  548.               Vektorgrafiken   verkettet.  Da  es  sinnvoll  ist,  den
  549.               Grafiken eigene Namen zu verleihen und über  die  Option
  550.               -n  nur ein Name gesetzt werden kann, solte man in jeder
  551.               Gruppe  den  Spezialtext  '((CN))/NAME/'  ablegen  um  die
  552.               einzelne Grafik später identifizieren zu können.
  553.               /Die  Vorhergehensweise  wird  klarer, wenn man eine GEM-
  554.               Meta-Datei  des   Dateiselektors   Freedom2   untersucht
  555.               (liegen   in   der   Freedom2-Distribution   im   Ordner
  556.               'VICON\SRC\')./
  557.  
  558.  -16          Farbfixierung nur  mit  den  ersten  16  (Standard-)VDI-
  559.               Farben  vornehmen.  Beim  Umwandlungsvorgang  werden die
  560.               Farben  der  GEM-Metadatei  die  noch  als   Farbanteile
  561.               beschrieben  sind  in  absolute VDI-Indizes umgewandelt.
  562.               Dieses geschieht nach dem Verfahren 'Best-Fit'  mit  der
  563.               aktuellen  Farbpalette.  Da  es nun nicht ausgeschlossen
  564.               ist, daß die benutzten Farben der  GEM-Metadatei  leicht
  565.               von  den  16  unteren  Systemfarben  abweichen  und  als
  566.               bestpassenste Farben Farben mit einem Index >16 gefunden
  567.               werden,  kann man die Suche auf die ersten 16 Farben mit
  568.               diesem Schalter beschränken. Da die ersten 16 Farben von
  569.               DR festgeschrieben sind, kann man so eine 'farbportable'
  570.               CVD-Datei erzeugen.
  571.  
  572.  -w           Anzeige  des  Konvertierungsvorgangs.  Alle  Übersetzten
  573.               VDI-Befehle werden auf dem Bildschirm ausgegeben.
  574.  
  575. Hauptsächtlich ist  der  Konvertierer (wie man vielleicht festgestellt
  576. haben wird) für ambitionierte Anwender und Programmierer interessant.
  577.  
  578.  
  579.  
  580. 5  An die programmierenden Zunft
  581. ********************************
  582.  
  583. Sie sind Programmierer, die Featureliste von Liberty  hat  Sie  locker
  584. vom  Hocker  geworfen und Sie sagen sich:"Eine tolle Library, die will
  585. ich auch unterstützen!"
  586.  
  587. /Kein Problem!/
  588.  
  589. Einzige Voraussetzung um die Library benutzen zu dürfen:  Ich  erhalte
  590. ein  kostenloses  Exemplar  des Programms welches die Library benutzt!
  591. Software die den Status 'Public Domain',  'Freeware'  oder  'Fairware'
  592. hat, ist davon natürlich ausgenommen ;-).
  593.  
  594. In der  letzten  Doku  zu  Liberty  habe  ich noch von einer seperaten
  595. Dokumentation für  Programmierer  gesprochen.  Da  die  Resonanz  aber
  596. unerwartet  groß  war  und  ich mir die Arbeit zwei Dokumentationen zu
  597. pflegen ersparen möchte, wird die Beschreibung der  Liberty-Funktionen
  598. *schrittweise* in diese Doku eingeflechtet.
  599.  
  600. /Was sie folgend als Beschreibung finden ist *keineswegs* vollständig!!!/
  601.  
  602. Man kann  aber  schon damit beginnen seine Programme anzupassen, um so
  603. in den Genuß der Liberty-Funktionen zu  gelangen.  Alles  was  folgend
  604. dokumentiert  ist,  wird  sich  *nicht* mehr  ändern und kann demzufolge
  605. problemlos verwendet werden.
  606.  
  607.  
  608. 5.1  Allgemeines
  609. ================
  610.  
  611. Ich möchte an dieser Stelle nicht alles wiederholen was  bereits  oben
  612. beschrieben  wurde.  Daher nur nochmal ein Kurzüberblick über das, was
  613. Programmierer wissen müssen:
  614.  
  615.    ∙ Alle Liberty-Funktionen sind reentrant! Man braucht sich folglich
  616.      *keine* Gedanken darüber machen, ob eine Funktion schon von anderen
  617.      Programmen/Threads benutzt wird!
  618.  
  619.    ∙ Bevor man eine  Liberty-Funktion  aufruft  sollte  man  lediglich
  620.      sicherstellen, daß die Funktion genügend Stack zur Verfügung hat.
  621.      Genügend heißt dabei *1k*! Mehr ist auf keinen Fall  nötig,  dieser
  622.      Platz sollte aber bereitgestellt werden.
  623.  
  624.    ∙ Liberty verändert keine Registerwerte in einer Funktion.
  625.  
  626.    ∙ Wenn  eine  Liberty-Funktion  einen  Rückgabewert liefert, sollte
  627.      dieser auch geprüft  werden,  um  die  korrekte  Abarbeitung  der
  628.      Funktion festzustellen.
  629.  
  630.    ∙ AUF  JEDEN  FALL  nur  dokumentierte Funktionen und Eigenschaften
  631.      nutzen!
  632.  
  633.    ∙ Jeden Hinweis auf Umgang mit Funktionen *genaustens* beachten.
  634.      Wenn eine Variable als 'Read-Only' gekennzeichnet  wurde,  sollte
  635.      man sie auch nicht überschreiben!
  636.  
  637.    ∙ Um  Doppeldeutungen  zu  vermeiden:  Ein Programm welches Liberty
  638.      benutzt wird folgend  immer  als  'Applikation'  bezeichnet.  Das
  639.      sollte man im Hinterkopf behalten...
  640.  
  641.  
  642. 5.1.1  Parameterübergabe
  643. ------------------------
  644.  
  645. Für die Parameterübergabe gelten die Regeln von Turbo C / Pure C:
  646. _Parameterübergabe Pure C (Auszug aus der Online Hilfe von PureC)_
  647.  
  648.    ∙ Die  ersten  drei Variablen vom Typ char, int oder long werden in
  649.      den Registern D0, D1, D2 übergeben.
  650.  
  651.    ∙ Die ersten zwei Adressparameter (Pointer) werden in den Registern
  652.      A0 und A1 übergeben.
  653.  
  654.    ∙ Weitere Parameter, die keinen Platz mehr in den Registern D0, D1,
  655.      D2, A0 A1 finden werden über den Stack übergeben.
  656.  
  657.    ∙ Parameter  werden  in  der  Reihenfolge  von  rechts  nach  links
  658.      übergeben.
  659.  
  660. _Beispiel:_
  661.  
  662.  
  663. extern void lbf(int x1, int y1, int x2, int y2, int *l, int *b, int *f);
  664. main()
  665. {
  666.     int x1 = 10, y1 = 10, x2 = 20, y2 = 20, l, b, f;
  667.     lbf(x1, y1, x2, y2, &l, &b, &f);
  668. }
  669.  
  670. Da mehr  Werte-,  als  auch  Adress-Parameter  an  die  Funktion "lbf"
  671. übergeben werden, als Register zur  Verfügung  stehen,  benötigen  wir
  672. also  in  jedem Fall den Stack. Der vierte Werte-Parameter muß auf dem
  673. Stack abgelegt  werden.  Ebenso  findet  der  dritte  Adress-Parameter
  674. keinen  Platz  in  den  Registern,  so  daß  auch dieser auf dem Stack
  675. abgelegt werden muß.
  676.  
  677. In den Registern befinden sich:
  678.  
  679.      D0: x1 (Wert von x1)
  680.      D1: y1 (Wert von y1)
  681.      D2: x2 (Wert von x2)
  682.      A0: &l (Adresse der Variablen l)
  683.      A1: &b (Adresse der Variablen b)
  684.  
  685.  
  686. Auf dem Stack befinden sich:
  687.  
  688.      &f (hi) (höchstwertiges Wort im Stack)
  689.      &f (lo)
  690.      y2 (Wert von y2)
  691.      Return- (Rücksprungadresse)
  692.      Adresse (Stackpointer zeigt hierauf)
  693.  
  694.  
  695. Der Adress-Parameter f wird  nach  der  Regel  "von-rechts-nach-links"
  696. zuerst  auf  den  Stack  gelegt.  Danach kommt der Wert von y2 auf den
  697. Stack.   Bitte   beachten   Sie,   daß   die   Rücksprungadresse   des
  698. Unterprogrammes  als letzter "Parameter" auf den Stack gelegt wird, so
  699. daß die Parameter im Stack ab dem Offset 4 anfangen. y2 (Offset 4), &f
  700. (Offset 6)!
  701.  
  702. In C  räumt  die  aufrufende  Funktion  nach  dem Aufruf die Parameter
  703. selbst vom Stack (z.B. mit ADDQ.W #8,A7", nach einem Aufruf  mit  zwei
  704. Adressparametern).  Dies  erübrigt sich natürlich, wenn alle Parameter
  705. in Registern übergeben wurden.
  706.  
  707.  
  708. 5.2  Der Liberty-Cookie & XBIOS-Erweiterung
  709. ===========================================
  710.  
  711. Liberty legt beim Start im Auto-Ordner einen Cookie-Jar an und erzeugt
  712. einen  Keks  namens  'Lity' dessen Inhalt auf eine Struktur weist, die
  713. dem  beigefügten  '.h'-File  und  dem  entsprechendem   Kapitel   (Die
  714. Liberty-Struktur) entnommen werden kann.
  715.  
  716. Da Liberty   XBIOS-Funktionen   installiert,  die  einen  komfortablen
  717. Zugriff auf den Cookie-Jar ermöglichen, kann auf sehr einfache Art und
  718. Weise das Vorhandensein von Liberty festgestellt werden.
  719.  
  720. Dazu ein Ausschnitt aus dem '.h'-File:
  721.  
  722.  
  723. #define CJar_xbios      0x434A            /* "CJ" */
  724. #define CJar_OK         0x6172            /* "ar" */
  725. #define COOKIE_LIBERTY  0x4C697479L       /* "Lity" */
  726. #define CJar( mode, cookie, value )   xbios(CJar_xbios,mode,cookie,value)
  727.  
  728.  
  729. Folgendes 'Programm'  prüft  somit, ob die Systemerweiterung vorhanden
  730. ist:
  731.  
  732. Liberty_Cookie *libfuncs;
  733.  
  734. if (CJar(0, COOKIE_LIBERTY, &libfuncs)==CJar_OK)
  735. {
  736.     printf("LIBERTY vorhanden!!!");
  737. }
  738. else
  739. {
  740.     printf("LIBERTY nicht vorhanden!!!");
  741. }
  742.  
  743.  
  744. Bevor ein Programm Liberty benutzt, sollte auf jeden Fall durch obiges
  745. Verfahren  festgestellt werden ob Liberty überhaupt vorhanden ist! Ist
  746. dies nicht der Fall muß das Programm gegebenenfalls terminiert werden.
  747.  
  748. _Zu den verschiedenen Modi:_ Der erste Parameter der  dem  Makro  'CJar'
  749. übergeben  wird,  bestimmt  den Modus der Cookie-Aufrufs. Im Gegensatz
  750. zum Original 'Cookie Jar Manager' von Dan Wilga (Liberty ist voll  zum
  751. 'JARXX' kompatibel, man benötigt es also nicht mehr), existieren sogar
  752. 3 Modi zur Keks-Manipulation:
  753.  
  754.    ∙ Modus 0:
  755.      Ermittelt den Wert des Kekses und  legt  in  an  der  angegebenen
  756.      Adresse  ab. Übergibt man für 'value' einen NULL Pointer, so wird
  757.      lediglich die Existenz des Kekses überprüft.
  758.      Bei erfolgreicher  Ermittlung  des  Kekses,  liefert  der  Aufruf
  759.      0x6172 (="CJar_OK") zurück sonst einen anderen Wert.
  760.  
  761.  
  762.    ∙ Modus 1:
  763.      Erzeugt einen neuen Keks (cookie). Value *zeigt* auf einen Wert der
  764.      in den Jar eingetragen  wird.  WICHTIG!  Es  wird  nicht  'value'
  765.      eingetragen  sondern  der  Wert  auf  den  'value'  weist!!!  Bei
  766.      Übergabe eines NULL-Pointers wird 0 als Kekswert eingetragen.
  767.      Existiert  der  Keks  bereits,  so   wird   sein   alter   Inhalt
  768.      überschrieben!
  769.      Die  Funktion  liefert "CJar_OK" bei erfolgreicher Eintragung. -1
  770.      wird für den Fall geliefert, daß der Cookie-Jar voll ist!
  771.  
  772.    ∙ Modus 2:
  773.      Entfernt den Keks 'cookie' aus dem Jar. Der Wert von 'value'  ist
  774.      egal.  Liefert bei erfolgreicher Entfernung "CJar_OK" sonst einen
  775.      anderen Wert.
  776.  
  777.  
  778. 5.3  Die Liberty-Struktur
  779. =========================
  780.  
  781. Der Inhalt des Liberty-Cookies weist auf folgende Struktur:
  782.  
  783. typedef struct
  784. {
  785.         WORD            version;        /* Hexadezimale Version. (0x0100 = 1.0)  */
  786.         WORD            gdriver;        /* Unterstützes Grafiksystem (READ_ONLY!):
  787.                                                  * 0 = keins -> Standardformat (SLOW!!!)
  788.                                                  * 1 = ATARI Grafiksystem (IBPs)
  789.                                                  * 2 = NOVA Grafikkarten (Intel-Zahlenformat)
  790.                                                  * 3 = andere Grafikkarten/Mac? (Motorola)
  791.                                                      * Wert ist bis zur Version 1.5 ungültig!!! */                                               */
  792.         Lity_Utils  *misc_funcs;/* Zeiger auf diverse Routinen */
  793.         Lity_GDExt      *gd_funcs;      /* Zeiger auf die 'GEMDOS'-Erweiterungen */
  794.         Lity_VDIExt     *vdi_funcs; /* Zeiger auf die 'VDI'-Erweiterungen    */
  795.         Lity_AESExt *aes_funcs; /* Zeiger auf die 'AES'-Erweiterungen    */
  796.         Lity_SNDExt *snd_funcs; /* Zeiger auf Sound-Funktionen */
  797.  
  798. } Liberty_Cookie;
  799.  
  800. Neben der  Versionsnummer  und   dem   Code   für   das   unterstützte
  801. Grafiksystem  findet  man  hier fünf weitere Zeiger auf Strukturen die
  802. folgend erläutert werden.
  803.  
  804.  
  805. 5.4  Die Utility-Funktionen
  806. ===========================
  807.  
  808. Die Funktionen  die  man  hier  vorfindet  lassen  sich  nicht   einer
  809. bestimmten  Kategorie  unterordnen.  Die  Struktur  enthält  mehr oder
  810. weniger 'zusammengewürfelte' Funktionszeiger:
  811.  
  812. typedef struct
  813. {
  814.         LONG     (*Init_Liberty)(WORD g_handle);
  815.         void     (*lock_Sema)(BYTE *semaphore);
  816.         void     (*release_Sema)(BYTE *semaphore);
  817.         void     (*memcpy)(void *dest, void *src, ULONG len);
  818.         void     (*memset)(void *dest, int val, ULONG len);
  819. } Lity_Utils;
  820.  
  821.  
  822. 5.4.1  Init_Liberty();
  823. ----------------------
  824.  
  825. bekommt als  Eingabeparameter  das  Handle  der  physikalischen   VDI-
  826. Workstation, in der Form wie es vom AES-Call 'graf_handle()' geliefert
  827. wird. Der Rückgabewert ist reserviert.
  828. *Diese Funktion ist vor  allen  anderen  Liberty-Funktionen  aufzurufen
  829. (abgesehen von der XBIOS-CJar-Erweiterung)!*
  830. Da  der  Aufruf  von graf_handle() unbedingt _nach_ einem appl_init() zu
  831. erfolgen hat (Stichwort: korrekte Applikationsprogrammierung), muß der
  832. appl_init()-Aufruf logischerweise vor dem graf_handle()-Aufruf erfolgt
  833. sein.  Die  Reihenfolge  der  Initalisierung   kann   man   auch   dem
  834. Programmbeispiel entnehmen.
  835.  
  836.  
  837. 5.4.2  lock_Sema();
  838. -------------------
  839.  
  840. Setzt (z.B.  für  Prozesskommunikation) eine Semaphore, dessen Adresse
  841. übergeben wird. Wer mit dem Begriff 'Semaphore' nichts anfangen  kann,
  842. wird diese Funktion wahrscheinlich auch nicht benötigen.
  843.  
  844.  
  845. 5.4.3  release_Sema();
  846. ----------------------
  847.  
  848. Gibt eine 'gelockte'-Semaphore wieder frei.
  849.  
  850.  
  851. 5.4.4  memcpy();
  852. ----------------
  853.  
  854. Bei dieser  Funktion handelt es sich um das altbekannte 'memcpy' jeder
  855. 'string.h'-C-Biblothek,  welches  einen  Speicherbereich  vorgegebener
  856. Länge kopiert.
  857. Warum dieser Funktion in Liberty aufgenommen wurde?
  858. Weil  viele  Programme (inkl. Liberty selbst) diese Funktion benötigen
  859. und das Benutzen der Funktion  via  Liberty  ein  wenig  Speicher  bei
  860. Applikation  einspart.  (Vorausgesetzt  man verwendet wirklich *nur* das
  861. Liberty 'memcpy()'!)
  862.  
  863.  
  864. 5.4.5  memset();
  865. ----------------
  866.  
  867. Für 'memset()' (ebenfalls eine  Standard-C  Funktionalität)  gilt  das
  868. gleiche  wie  schon bei 'memcpy()' beschrieben. Nur das diese Funktion
  869. zum Setzen eines Speicherbereiches auf einen bestimmten Wert verwendet
  870. wird.
  871.  
  872.  
  873. 5.5  Die 'GEMDOS-Erweiterungen'
  874. ===============================
  875.  
  876. Die Struktur  'Lity_GDExt'  enhält  fünf Funktionen die alle 'GEMDOS'-
  877. charakteristisch  sind.  Hauptsächlich  dienen  die   Funktionen   der
  878. Kontrolle über die Liberty Speicherverwaltung:
  879.  
  880. typedef struct
  881. {
  882.         Meminfo *       (*CK_init_meminfo)(Meminfo *info, BOOLEAN app);
  883.         void *          (*CK_malloc)(Meminfo *info, const long size, const WORD type);
  884.         void *          (*CK_realloc)(Meminfo *info, const void *block, const LONG newsize);
  885.         void            (*CK_free)(const Meminfo *info, const void *ptr);
  886.         void            *reserved;
  887.         void *          (*CK_load_buffer)(char *filename, Meminfo *info, WORD type, LONG addmem, LONG *buflen);
  888.  
  889. } Lity_GDExt;
  890.  
  891. /Die Form  der  'Meminfo'-Struktur  entnimmt  man der beigefügten '.h'-
  892. Datei./
  893.  
  894.  
  895. 5.5.1  CK_init_meminfo()
  896. ------------------------
  897.  
  898. Eine Applikation die die Liberty-Speicherverwaltung nutzen will,  muss
  899. bevor sie Speicher via Liberty anfordern kann drei Dinge tun:
  900.  
  901.   1. Eine globale Variable des Typs 'Meminfo' bereitstellen...
  902.  
  903.   2. Eine  globale  Variable  der  Typs  'Meminfo*'  (Zeiger  auf eine
  904.      'Meminfo'-Struktur' anlegen
  905.  
  906.   3. und  diese  durch  Zuweisung  des  Rückgabewertes  der   Funktion
  907.      'CK_init_meminfo()' initalisieren.
  908.  
  909. Als ersten  Parameter muss man dabei die Adresse der globalen Meminfo-
  910. Variablen übergeben (siehem auch Programmbeispiel).
  911.  
  912. /Was ist der Sinn dieser Aktion?/
  913. Liberty untersucht je nach Betriebssystem und Startmodus (ACC/APP)  ob
  914. es die Meminfoblöcke verschiedener Liberty-Applikationen zusammenlegen
  915. kann, um eine effizientere Speicherverwaltung zu ermöglichen.
  916. Folglich muss  der  Zeiger  den  man  als  Rückgabewert  erhält  nicht
  917. identisch  mit  der  Adresse des eigenen 'Meminfo'-Blocks sein. *Dieser
  918. Zeiger  (Rückgabewert)  ist  aber   der   einzige,   der   bei   allen
  919. nachfolgenden  Liberty-Funktionsaufrufen die nach einem entsprechenden
  920. Typ verlangen übergeben werden darf.*
  921.  
  922. _Außerdem:_
  923. Jeglicher Inhalt  der  'Meminfo'  (Struktur-)Variablen  darf  von  der
  924. Applikation   *nicht* angetastet   werden!   Liberty  obligt  die  volle
  925. Kontrolle dieser Struktur! Ein Verändern der  'Meminfo'-Inhalte  führt
  926. unweigerlich   zur   totalen  Verwirrung  der  Speicherverwaltung  und
  927. Systeminstabilität ist die Folge!
  928.  
  929. Der zweite Parameter des 'CK_init_meminfo()'-Calls  (app)  besagt,  ob
  930. die  Applikation  als eine solche (1) oder als Accessory (0) gestartet
  931. wurde. Zur Ermittlung dieses  Wertes  verwendet  man  das  landläufige
  932. Verfahren  welches  im  Profibuch  (10. Auflage) Seite 541 beschrieben
  933. ist.
  934.  
  935. /Im Falle der Verwendung von PureC kann man auch  gleich  die  Variable
  936. des    PureC-Startup-Codes    '_app'    benutzen    (wie    auch    im
  937. Programmbeispiel), oder man setzt den Parameter, für den Fall daß  die
  938. Applikation  nur  als  eine  solche  und nicht als Accessory gestarted
  939. werden darf, gleich statisch auf 'TRUE'./
  940.  
  941. Noch etwas:
  942. Natürlich sollte man in seiner Applikation nur /eine/ Speicherverwaltung
  943. nutzen.  Die Vermischung von Speicheranforderungen via z.B. GEMDOS, C-
  944. Library und Liberty führen zwar  nicht  zur  Applikationsinstabilität,
  945. aber   sind   alles   andere  als  guter  Programmierstil,  da  schwer
  946. kontrollierbar (welchen Block muß ich wie freigeben) und ineffizient.
  947. Die Verwendung  der  Liberty-Speicherverwaltung  sollte  ohnehin  alle
  948. Speicheranforderungsbedürfnisse des Programmierers befriedigen und ein
  949. Mischen von Aufrufen unnötig machen.
  950.  
  951.  
  952. 5.5.2  CK_malloc()
  953. ------------------
  954.  
  955. Diese Funktion fordert Speicher vom System an. Im Gegensatz zum GEMDOS
  956. werden  aber  kleinere Speicherblöcke automatisch in grösseren Blöcken
  957. gehalten  um  evt.  Betriebssystembeschränkungen   zu   umgehen.   Die
  958. Verwaltung  der  Blöcke  ist äußerst effizient, schnell und sollte auf
  959. jedem Fall andern Speicheranforderungsmechanismen  vorgezogen  werden,
  960. da  auch  noch  andere  Argumente  für  die  Verwendung  der  Liberty-
  961. Speicherverwaltung sprechen:
  962.  
  963.    ∙ Liberty sorgt auch bei  Accessories  unter  Single  TOS  für  ein
  964.      'festes'  Malloc. Normalerweise gehört Speicher, der nachträglich
  965.      von Accessories unter Single TOS angefordert wird  der  aktuellen
  966.      Hauptapplikation  und /nicht/ dem Accessory. Das führt beim Beenden
  967.      der Hauptapplikation zu ungewolltem Speicherverlust  seitens  des
  968.      Accs und ist eine häufige Fehlerquelle.
  969.      Dieses    Problem   existiert   bei   Verwendung   der   Liberty-
  970.      Speicherverwaltung nicht mehr!
  971.  
  972.    ∙ Liberty ermöglicht eine optimale  Verwaltung  von  Speicher  auch
  973.      unter Systemen mit Speicherschutz ('Memory-Protection').
  974.      Bei  der  Anforderung  von  Speicher  via  'CK_malloc()' kann die
  975.      gewünschte Speicherart übergeben werden (Parameter 'type'):
  976.  
  977.       MM_STGLOBAL   bei Übergabe dieses Speichertyps  fordert  Liberty
  978.                     globales   (ungeschütztes)  ST-RAM  an  (z.B.  für
  979.                     'Message-Puffer')
  980.  
  981.       MM_STPRIVATE  Liberty fordert privates (geschütztes) ST-RAM an
  982.  
  983.       MM_TTGLOBAL   hier   fordert    Liberty    *vorzugsweise* globales
  984.                     (ungeschütztes)  TT-RAM  an.  Steht nicht genügend
  985.                     TT-RAM (wird auch als 'Fast-RAM'  bezeichnet)  zur
  986.                     Verfügung,   wird  automatisch  (globales)  ST-RAM
  987.                     angefordert.
  988.  
  989.       MM_TTPRIVATE  Liberty versucht privates (geschütztes) TT-RAM  zu
  990.                     reservieren.   Steht  nicht  genügend  TT-RAM  zur
  991.                     Verfügung,  wird  automatisch  (privates)   ST-RAM
  992.                     angefordert.  Dieses  ist  wohl  der am häufigsten
  993.                     verwendete Typ der Speicheranforderung ('schnell &
  994.                     sicher').
  995.  
  996.      Das Besondere  der  Speicheranforderungen seitens Liberty besteht
  997.      nun  darin,  dass  die   Speicherblöcke   je   nach   tatsächlich
  998.      vorhandener  Speicherart  optimiert  gehalten werden. Mit anderen
  999.      Worten:  Exisitiert  nur  globaler  Speicher   (weil   z.B.   die
  1000.      Applikation  unter  einem  Betriebssystem gestartet wurde welches
  1001.      nur  'nicht   privaten   Speicher'   unterstützt)   werden   alle
  1002.      Anforderungen von privatem Speicher in Anforderungen von globalem
  1003.      Speicher umgesetzt. Dieses Verfahren spart dadurch sogar z.T. das
  1004.      Anfordern von neuen GEMDOS-Systemblöcken und damit Speicherplatz.
  1005.  
  1006.    ∙ Die  Speicherverwaltung von Liberty prüft einige Kriterien ob der
  1007.      von ihr verwaltete Speicher durch  eine  Applikation  korrumpiert
  1008.      wurde.  In  diesem  Fall erhält man entsprechende Fehlermeldungen
  1009.      auf dem Bildschirm. So wird man auf  Applikationsfehler  bei  der
  1010.      Verendung  von  Speicher hingewiesen, was bei der Entwicklung von
  1011.      Programmen kein unwesentlicher Punkt ist.
  1012.  
  1013. Doch zurück zum 'CK_malloc()':
  1014. Neben der Übergabe des  zuvor  beschriebenen  'Meminfo'-Pointers  wird
  1015. noch  die  anzuforderne  Blockgrösse  in  Byte  sowie  der  oben schon
  1016. beschriebene Speichertyp  mit  übergeben.  Der  Rückgabewert  ist  ein
  1017. Zeiger  auf  den  Block oder 'NULL' falls entsprechener Speicher nicht
  1018. angefordert werden konnte (Speicherknappheit).
  1019.  
  1020.  
  1021. 5.5.3  CK_realloc()
  1022. -------------------
  1023.  
  1024. Diese Liberty-Routine  arbeitet  analog  zum  C-'realloc()'  und   dem
  1025. Liberty-'CK_malloc()'.
  1026. / Eine Speichertypänderung ist *nicht* möglich!/
  1027.  
  1028.  
  1029. 5.5.4  CK_free()
  1030. ----------------
  1031.  
  1032. ist die Implementierung des C-'free()' der Liberty-Speicherverwaltung.
  1033.  
  1034.  
  1035. 5.5.5  CK_load_buffer()
  1036. -----------------------
  1037.  
  1038. Wie oft  kommt es vor das ein Programmierer eine Datei in einen Puffer
  1039. laden muß und  jedesmal  die  gleiche  Sequenz  von  Funktionsaufrufen
  1040. getätigt wird...
  1041.  
  1042. Damit sollte  nun Schluss sein. Die Parameter der Liberty-Buffer-Lade-
  1043. Funktion sollten eigentlich selbsterklärend sein, hier  aber  trotzdem
  1044. die Übersicht:
  1045.  
  1046.  filename  Dateiname der zu ladenen Datei
  1047.  
  1048.  info      der schon bekannte Meminfo-Pointer
  1049.  
  1050.  type      anzuforderne Speicherart
  1051.  
  1052.  addmem    Anzahl  der  Bytes  die  zusätzlich anzufordern sind. Diese
  1053.            sind nach dem Laden der  Datei  am  Ende  des  Buffers  und
  1054.            unbelegt.
  1055.  
  1056. Die Funktion  liefert einen Zeiger auf den angeforderten und geladenen
  1057. Buffer oder 'NULL' falls ein  Fehler  aufgetreten  ist  (Datei  konnte
  1058. nicht geladen werden, zu wenig Speicher vorhanden etc.).
  1059.  
  1060. Jetzt kommt's:  Als  besonderes Schmankerl kann die Buffer-Laderoutine
  1061. aber noch mehr: Dateien die mit  dem  'ATOMIK'-Packer  gepackt  wurden
  1062. (ein  äußerst  effzienter  Packer  dessen Dateien zusätzlich auch noch
  1063. flink zu dekodieren sind) werden automatisch ausgepackt!
  1064.  
  1065. Das Packen ist z.B. sinnvoll bei MOD-Files, bestimmten Grafikformaten,
  1066. archivierten  Texten  oder  sonstigen  einteiligen, großen Dateien die
  1067. nicht oder sehr selten angetastet werden.
  1068.  
  1069.  
  1070. 5.6  Die 'VDI-Erweiterungen'
  1071. ============================
  1072.  
  1073. Hier kommt noch etwas hin...
  1074.  
  1075.  
  1076. 5.7  Die 'AES-Unterstützung'
  1077. ============================
  1078.  
  1079. Hier kommt noch etwas hin...
  1080.  
  1081.  
  1082. 5.8  Die Sound-Funktionen
  1083. =========================
  1084.  
  1085. Hier kommt noch etwas hin...
  1086.  
  1087.  
  1088. 5.9  Programmbeispiel
  1089. =====================
  1090.  
  1091. Das Programmbeispiel geht davon aus, daß die '.h'-Dateien  'LIBERTY.H'
  1092. und  'IBMR.H'  in Standard-Include-Verzeichnis des C-Compilers liegen.
  1093. Das hier gezeigte Beispiel demonstriert die Initalisierung der Library
  1094. und Speicherverwaltung unter PureC:
  1095.  
  1096. #include <liberty.h>
  1097. #include <stdio.h>
  1098. #include <stdlib.h>
  1099. #include <stddef.h>
  1100. #include <aes.h>
  1101. #include <vdi.h>
  1102. #include <tos.h>
  1103.  
  1104. Meminfo         minfo, *mi;                     /* Applikations Meminfo-Block und Zeiger */
  1105.  
  1106. void main(void)                 /* Dieses Programm macht nix... */
  1107. {
  1108.         Liberty_Cookie  *libstruct;
  1109.         Lity_GDExt              *gdfuncs;
  1110.         int                     d1, d2, d3, d4, grhandle;
  1111.  
  1112.         appl_init();                            /* ...obwohl es einige Programmierer noch
  1113.                                                                    nicht begriffen haben: DAS GEHÖRT SICH SO! */
  1114.  
  1115.         if (CJar(0,COOKIE_LIBERTY,&libstruct) != CJar_OK)
  1116.         {
  1117.                 form_alert(1,"[3][This Application needs LIBERTY to run...][Exit!]");
  1118.                 appl_exit();
  1119.                 return;
  1120.         }
  1121.  
  1122.         vh = graf_handle(&d1, &d2, &d3, &d4);
  1123.  
  1124.         libstruct->misc_funcs->Init_Liberty(grhandle);  /* Liberty initalisieren */
  1125.  
  1126.         gdfuncs = libstruct->gd_funcs;                                  /* ...trägt nur zur
  1127.                                                                                                            Lesbarkeit bei... */
  1128.  
  1129.         mi = gdfuncs->CK_init_meminfo(&minfo,_app);     /* Speicherverwaltungsinit */
  1130.  
  1131. /* HIER STEHT DAS EIGENTLICHE PROGRAMM ! */
  1132. /* ...für Meminfos wird jetzt immer 'mi' übergeben !!! */
  1133.  
  1134.         if (_app)                                       /* Applikation ? */
  1135.                 appl_exit();                                /* raus... (MT-OS Behandlung
  1136.                                                                                                            der Einfachheit wegen
  1137.                                                                                                            weggelassen) */
  1138.         else
  1139.                 for (;;)                                    /* Beim Acc sporadisch */
  1140.                         evnt_timer(0,32000);                                    /* beenden             */
  1141. }
  1142.  
  1143.  
  1144.  
  1145. 6  Ausblick
  1146. ***********
  1147.  
  1148. Zum Zeitpunkt  dieser  Veröffentlichung von 'Liberty' sind die Raster-
  1149. grafikfunktionen leider alles andere als komplett. Damit  aber  andere
  1150. schon  jetzt  zumindest in den Genuß der restlichen Liberty Funktionen
  1151. kommen, habe ich mich dennoch für die Herausgabe der Library im  nicht
  1152. vollständigem Zustand entschieden.
  1153. Erste  Erweiterung  wird folglich darin bestehen, den Rastergrafikteil
  1154. vollständig auszubauen. Aber  auch  im  Vektorgrafikteil  fehlen  noch
  1155. einige wünschenswerte Zusatzfunktionen.
  1156.  
  1157. Wie danach   die  Weiterentwicklung  verläuft  ist  schwer  zu  sagen.
  1158. Hauptsächlich hängt das von meinen eigenen  Bedürfnissen  ab.  Selbst-
  1159. verständlich  können  auch  Wünsche  anderer Programmierer die Liberty
  1160. nutzen (wollen) den Funktionsumfang erweitern. Jedoch werde ich strikt
  1161. darauf  achten,  daß  Liberty  nie  mehr als 50k Speicher schluckt und
  1162. nicht zum schon beschriebenen 'Klotz' wird.
  1163.  
  1164. Welche Funktionen  Liberty  bietet  kann  dem   'einfachen'   Anwender
  1165. eigentlich  egal  sein.  Er  kommt  meist  unbemerkt  in den Genuß der
  1166. Funktion, sobald ein Programm sie  benutzt.  Das  einzige  worauf  ein
  1167. Anwender  achten  sollte  ist,  daß  er  möglichst  immer  die  neuste
  1168. Liberty-Version installiert hat.  Da  Liberty  benutzenden  Programmen
  1169. beigefügt werden darf, dürfte diese Forderung leicht zu erfüllen sein.
  1170.  
  1171.  
  1172.  
  1173. 7  Changes
  1174. **********
  1175.  
  1176. *Änderungen Version 1.31*
  1177.  
  1178.    ∙ Einen  Fehler  in der Speicherverwaltung von Liberty behoben, der
  1179.      dafür verantwortlich war, daß unter 'Single TOS' mit alternativem
  1180.      Speicher  bei  Anforderung  von  ST-RAM trotzdem alternatives RAM
  1181.      angefordert wurde. Dadurch blieb z.B. die Soundausgabe bei obiger
  1182.      Konfiguration stumm.
  1183.  
  1184.    ∙ Das  Problem  der  Applikations-ID-Vergabe  unter NAES gemildert:
  1185.      Liberty kann nun AES-Calls bis zur  AP-ID  128  verarbeiten  (war
  1186.      64).  Dennoch:  Dadurch  das NAES immer die AP-ID seiner Prozesse
  1187.      hochzählt und unbenutze IDs  nicht  neu  vergibt,  ist  nach  128
  1188.      Applikationsstarts  Schluß  mit den AES-Features von Liberty. Die
  1189.      Auswirkung: Freedom2 kann nicht mehr von  Applikationen  mit  IDs
  1190.      jenseits  von  128  aufgerufen  werden.  Das Problem läßt sich in
  1191.      Liberty nicht auf einfache Art lösen, eine weitere Steigerung des
  1192.      ID-Raumes  würde  viel  zusätzlichen  Speicher verschlingen. NAES
  1193.      verhält sich in  diesem  Punkt  anders,  als  alle  anderen  TOS-
  1194.      kompatiblen  Betriebssysteme.  Ich hoffe also das sich in NAES da
  1195.      noch etwas tut ;-).
  1196.  
  1197.    ∙ ...viel, viel zu tun...
  1198.  
  1199. *Änderungen Version 1.30*
  1200.  
  1201.    ∙ Ich kann's  nicht  fassen.  Unsaubere  Applikation  bringen  mich
  1202.      irgendwann  einmal  noch  um den Verstand. In dieser Version habe
  1203.      ich      DEFINITIV       die       letzte       Änderung       am
  1204.      Schweineprogrammbehandlungsteil         vorgenommen.         Eine
  1205.      Sonderbehandlung  für  MTOS/NAES  und  MagiC  soll  nun  maximale
  1206.      Kompatibilität  auch  bei  unsauberen  Programmen  bringen.  U.a.
  1207.      profitieren dadurch auch ältere Versionen von MGCOPY,MGVIEW etc.,
  1208.      die, was die Sauberkeit der Systemanbindung anging, noch nicht so
  1209.      prall waren. Die jetzige  Schweineprogrammbehandlungsroutine  ist
  1210.      *definitiv* der Weisheit letzter Schluss!
  1211.      Da   OAESis  nicht  ein  vernünftiges  appl_find(NULL)  anbietet,
  1212.      sondern  ziemlichen  Blödsinn  macht,  kann  ich   OAESis   *nicht*
  1213.      empfehlen.
  1214.      Liberty    es    ist    praktisch    unmöglich   Liberty&Freedom2
  1215.      unproblematisch unter OAESis zum Laufen zu bringen. Aussagen über
  1216.      GENEVA und XAES kann ich nicht treffen.
  1217.      _WICHTIG:_ Damit  Liberty  ordnungsgemäß  unter MagiC arbeitet, ist
  1218.      eine MagiC-Version >= 3.x unabdingbar!!!
  1219.  
  1220.    ∙ Besitzer von Rechnern mit DMA-Sound ((Mega)STE,  TT)  kommen  nun
  1221.      endlich auch in den Genuß der Liberty-Soundfunktionen. Neben Macs
  1222.      mit 'MACSOUND' und Falcons kommt bei  diesen  Rechnern  nun  also
  1223.      auch  Freude  auf, wenn man im Freedom2 Info-Dialog auf das große
  1224.      'Freedom-Logo' klickt... (wenn die Software  der  Startrack-Karte
  1225.      für  den  HADES auch einen 'McSn'-Cookie anlegt (tut sie das? wer
  1226.      sagt's mir?), bekommen die HADES-User auch was zu hören...)
  1227.  
  1228.    ∙ Weitere Beschreibungen von Liberty für Programmierer in die  Doku
  1229.      integriert.
  1230.  
  1231. *Änderungen Version 1.20*
  1232.  
  1233.    ∙ Endlich  arbeitet  Liberty mit NAES korrekt zusammen. Was war die
  1234.      Ursache? Na ? - Die Schweineprogrammbehandlung.
  1235.      Ohne einen Anruf von Rainer Mannigel (NAES-Entwickler)  wäre  das
  1236.      wohl  nie  etwas  geworden.  Durch  ihn  habe  ich von einer NAES
  1237.      internen Sache erfahren und das ermöglichte  mir  Liberty  darauf
  1238.      abzustimmen.
  1239.      Ich  hoffe  den  Schweineprogrammbehandlungsteil  nun  nicht mehr
  1240.      anfassen zu müssen... ;-)
  1241.  
  1242. *Änderungen Version 1.15*
  1243.  
  1244.    ∙ Liberty  ist   jetzt   /noch/ rücksichtsvoller   Schweineprogrammen
  1245.      gegenüber  und  billigt  ihnen  mehr  SV-Stack zu. (Das kostet 5k
  1246.      mehr... :-()
  1247.      Dadurch läuft jetzt Liberty mit dem VT52 Emulator in der  Version
  1248.      1.3 zusammen was einem Benutzer ;-) besonders wichtig war...
  1249.  
  1250.    ∙ Das  'free' der Speicherverwaltung von Liberty erlaubte nicht das
  1251.      Freigeben eines NULL-Pointers, was  aber  offiziell  dokumentiert
  1252.      ist.
  1253.  
  1254. *Änderungen Version 1.1*
  1255.  
  1256.    ∙ Liberty  benutzt jetzt ein anderes Verfahren um schweinische AES-
  1257.      Calls zu 'reparieren'. Damit sollten (hoffentlich)  die  Probleme
  1258.      die  im  Zusammenhang mit 'Calamus96' auftreten der Vergangenheit
  1259.      angehören. Ich möchte ausdrücklich betonen, daß die Probleme  von
  1260.      'Calamus96'-Modulen   ausgehen   und   Liberty   jetzt  nur  /noch/
  1261.      rücksichtsvoller mit unsauberen Programmen umgeht.
  1262.      Gleiches gilt auch für 'OverPaint' (getestet mit der Demo-Version
  1263.      1.5s).
  1264.      Ich  weise  in  diesem  Zusammenhang  darauf  hin,  daß  das neue
  1265.      Verfahren mehr Zeit  benötigt  und  es  dadurch  zu  (merklichen)
  1266.      Performance-Verlusten  bei  unsauberen  Programmen  kommen  kann!
  1267.      (...aber lieber ein langsam ablaufendes Schweineprogramm als  ein
  1268.      abstürzendes... - oder?)
  1269.      Nochmals  meine  Bitte  an  alle  Programmierer:  Achtet bei AES-
  1270.      Aufrufen  darauf,  daß  ihr  einen   *korrekten/initialiserten* und
  1271.      *vollständigen* AES-Parameterblock verwendet!!!
  1272.  
  1273.    ∙ Es  liegt  ein  Patchfile  für  MacSnd  dabei.  Das entsprechende
  1274.      Kapitel beachten!
  1275.  
  1276.    ∙ Die ersten Beschreibungen von Liberty für  Programmierer  in  die
  1277.      Doku integriert.
  1278.  
  1279. ...to be continued
  1280.  
  1281.  
  1282.  
  1283. 8  Kontaktadresse
  1284. *****************
  1285.  
  1286. Falls Sie irgendwelche Fragen, Probleme oder Wünsche bezüglich Liberty
  1287. haben sollten, können Sie mich unter folgender Adresse erreichen:
  1288.  
  1289. Christian Krüger
  1290. Im Erpelgrund 16
  1291. 13503 Berlin
  1292.  
  1293. Internet email: chris@pace.de
  1294.  
  1295. *Wichtig:* Wer Kontakt via Sackpost zu mir aufnehmen  will,  der  sollte
  1296. (wenn  er  eine  Antwort  erwartet)  einen  an  sich  adressierten und
  1297. ausreichend frankierten Rückumschlag beifügen!
  1298. Man kann mich auch anrufen, aber *_bitte_* nur von Mo-Do in der  Zeit  von
  1299. 20:30-21:00  Uhr oder 22:00-22:30 Uhr! Wer zu anderen Zeiten die (030)
  1300. 436 27 85 wählt braucht  sich  nicht  zu  wundern,  wenn  er  entweder
  1301. niemanden  erreicht  oder  mich ziemlich sauer oder kurz angebunden an
  1302. die Strippe bekommt!
  1303. Von privaten Besuchen bitte ich  abzusehen,  die  Erfolgschancen  mich
  1304. anzutreffen sind ohnehin ziemlich gering.
  1305. Außerdem  bitte  ich alle Anwender der Library nur dann zu mir Kontakt
  1306. aufzunehmen, wenn unlösbare Probleme oder gravierende Mängel  bei  der
  1307. Installation  der  Library  auftreten!  (Ich verstehe darunter das man
  1308. sich mindestens 2x die Liberty-  Dokumentation  durchgelesen  hat  und
  1309. immernoch nicht schlauer ist!!!)
  1310. Zeit die ich mit der Beantwortung von Fragen verbringe steht mir nicht
  1311. mehr zum Programmieren zur Verfügung...  (Ein  gutes  und  hilfreiches
  1312. Forum  um solche Fragen evt. zu klären stellt die "Hotline der Share-/
  1313. Freeware", das Maus-Netz, Gruppe 'atari.soft' dar.  Wären  hier  nicht
  1314. viele  hilfsbereite und kompetente Menschen zugegen, die bei Fragen zu
  1315. Programmen   durch   ihre   Beantwortung   für   die   Programmautoren
  1316. einspringen,  wer weiß ob Liberty hätte jemals entstehen können... Ich
  1317. widme daher diese Library  allen  Atari-Enthusiasten  im  Maus-Netz  -
  1318. *Danke!* :-) )
  1319.  
  1320. /Rächtzszeibunsfälör by Zeitmangel und Portfolio-Tastatur!/
  1321.  
  1322.  
  1323.  
  1324.